/**
 * 给定数组，两类操作：
 * 0: 求所有元素的gcd
 * x: 将Ax改为0
 * 因为gcd(0, n) == n
 * 所以只要施加x操作之后，Ax就不影响后续答案了
 * 因此可以反过来操作，记录答案以后，再输出
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>

using Real = long double;
using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;

llt const MOD = 998244353LL;

int N, Q;
vector<llt> A;
vi Questions;

llt proc(){
    vector<llt> a(A.begin(), A.end());
    for(auto i : Questions){
        if(i) a[i] = 0;
    }

    llt g = 0LL;
    for(auto i : a) g = __gcd(i, g);

    llt ans = 0;
    for(auto it=Questions.rbegin(),et=Questions.rend();it!=et;++it){
        if(*it){
            g = __gcd(g, a[*it] = A[*it]);
        }else{
            ans = (ans + g) % MOD;
        }
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofakse = 1;
    // cin >> nofakse;
    while(nofakse--){
        cin >> N >> Q;
        A.assign(N + 1, 0);
        for(int i=1;i<=N;++i) cin >> A[i];
        Questions.assign(Q, 0);
        for(auto & i : Questions) cin >> i;
        cout << proc() << endl;
    }
    return 0;
}